/**
 * @file SeqList.h
 * @brief 顺序表类的定义
 * 
 * 实现了动态扩容的顺序表，支持元素的添加、删除、查找等操作。
 */
#pragma once
#include <iostream>
#include <algorithm>
using namespace std;

/**
 * @brief 顺序表类模板
 * 
 * 一个基于动态数组实现的顺序表，支持任意类型的元素存储和基本操作。
 * 	支持动态扩容、添加、删除、查找等功能。
 * 	@tparam T 顺序表中存储的元素类型
 */
template<typename T>
class SeqList{
private:
	T *data; ///< 存储元素的动态数组指针
	size_t len=0; ///< 当前存储的元素个数
	size_t capacity=0; ///< 当前数组的容量
public:
	/**
	 * @brief 默认构造函数
	 * 
	 * 创建一个默认容量为10的空顺序表。
	 */
	SeqList();
	
	/**
	 * @brief 带参数的构造函数
	 * 
	 * 创建一个指定容量的空顺序表。
	 * @param capacity 顺序表的初始容量
	 */
	SeqList(const size_t &capacity);
	
	/**
	 * @brief 析构函数
	 * 
	 * 释放顺序表占用的动态内存。
	 */
	~SeqList();
	
	/**
	 * @brief 扩容操作
	 * 
	 * 将顺序表的容量扩大到指定大小。
	 * @param newCapacity 新的顺序表容量，必须大于当前容量
	 */
	void enlarge(const size_t &newCapacity);
	
	/**
	 * @brief 在尾部添加元素
	 * 
	 * 在顺序表的末尾添加一个新元素，如果容量不足则自动扩容。
	 * @param val 要添加的元素值
	 */
	void push_back(const T&val);
	
	/**
	 * @brief 删除指定元素
	 * 
	 * 删除顺序表中第一个值等于val的元素。
	 * @param val 要删除的元素值
	 */
	void remove(const T&val);
	
	/**
	 * @brief 在指定位置插入元素
	 * 
	 * 在顺序表的指定索引位置插入一个新元素。
	 * @param index 插入位置的索引（0 <= index <= len）
	 * @param val 要插入的元素值
	 */
	void insert(const size_t &index,const T&val);
	
	/**
	 * @brief 查找元素
	 * 
	 * 查找顺序表中是否存在指定值的元素。
	 * @param val 要查找的元素值
	 * @return 如果找到返回true，否则返回false
	 */
	bool find(const T&val);
	
	/**
	 * @brief 显示所有元素
	 * 
	 * 打印顺序表中所有元素到标准输出。
	 */
	void show();

	/**
	 * @brief 获取元素个数
	 * 
	 * @return 当前顺序表中存储的元素个数
	 */
	size_t getLen() const;

	/**
	 * @brief 获取当前容量
	 * 
	 * @return 当前顺序表的容量
	 */
	size_t getCapacity() const;
}; // class SeqList


// 在头文件末尾包含tpp实现文件
#include "SeqList.tpp"